﻿#define _CRT_SECURE_NO_WARNINGS 1
// 原题连接：https://www.acwing.com/problem/content/5566/
/*
题目描述：
使用传统字典序对单词进行排序的做法如下（摘自百度百科）。

先按照第一个字母，以 a,b,c,…,z
 的顺序排列；如果第一个字母一样，那么比较第二个、第三个乃至后面的字母。如果比到最后两个单词不一样长（比如，sigh 和 sight），那么把短者排在前。

自定义字典序是指重新规定 a∼z
 的相对顺序，然后按照上述方法对单词进行排序。

给定 n
 个单词在某种自定义字典序下的顺序，请你计算该自定义字典序中 a∼z
 的相对顺序。

输入格式
第一行包含整数 n
。

接下来 n
 行，每行包含一个由小写字母构成的字符串，表示一个单词。

所有单词两两不同，且按照自定义字典序的顺序给出。

输出格式
输出自定义字典序中 a∼z
 的相对顺序，即一个 a∼z
 的排列。

如果无解，则输出 Impossible。

如果答案不唯一，输出任意合理答案均可。

数据范围
前 6
 个测试点满足 1≤n≤10
。
所有测试点满足 1≤n≤100
，每个单词的长度 [1,100]
。

输入样例1：
3
rkvist
scankr
ameinaf
输出样例1：
bcdefghijklmnopqrsatuvwxyz
输入样例2：
10
arifhba
ktaf
coqglqf
utkiarnb
stkhmjnrs
bvraaci
rrrrrrrrrrrrrrrr
bilbvfhltf
frcxjfw
ajnwtnyhnttf
输出样例2：
Impossible
输入样例3：
10
pyxd
yahd
ysciahdghs
jyjydgris
gbhryxismidhwishri
thkxti
cwgxdgmz
widixkshuoyid
odychdqialidxldsgt
namjhdyryd
输出样例3：
abdefhiklmpqrsuvxyjgtcwonz
*/

// 开始解题：
// 方法——拓扑排序
#include <iostream>
#include <cstring>
using namespace std;
const int N = 110, M = 28;
char words[N][N];
int in[M];
int edges[M][M];
int q[M];
int n = 0;

bool check(char* s1, char* s2) {
    int len = min(strlen(s1), strlen(s2));
    for (int i = 0; i < len; i++) {
        if (s1[i] != s2[i]) {
            if (edges[s1[i] - 'a'][s2[i] - 'a'] == -1) {
                edges[s1[i] - 'a'][s2[i] - 'a'] = 1;
                in[s2[i] - 'a']++;
            }
            return true;
        }
    }
    return !(strlen(s1) > strlen(s2));
}



int main() {
    scanf("%d", &n);
    memset(in, 0, sizeof in);
    memset(edges, -1, sizeof edges);
    for (int i = 0; i < n; i++) {
        scanf("%s", words[i]);
    }
    //// 初始化入度数组
    //for (int i = 0; i < n; i++) {
    //    for (int j = 0; j < strlen(words[i]); j++) {
    //        in[words[i][j] - 'a'] = 0;
    //    }
    //}


    // 建图
    for (int i = 0; i + 1 < n; i++) {
        if (!check(words[i], words[i + 1])) {
            printf("Impossible\n");
            return 0;
        }
    }


    // 拓扑排序
    int front = 0, tail = 0;
    for (int i = 0; i < 26; i++) {
        if (in[i] == 0) {
            q[tail++] = i;
        }
    }
    while (front <= tail) {
        int t = q[front++];

        for (int i = 0; i < 26; i++) {
            if (edges[t][i] != -1) {
                if (--in[i] == 0) {
                    q[tail++] = i;
                }
            }
        }
    }

    if (tail == 26) {
        for (int i = 0; i < 26; i++) {
            printf("%c", q[i] + 'a');
        }
        printf("\n");
    }
    else {
        printf("Impossible\n");
    }
    return 0;
}